springboot beanDefinition转化为beanInstance再到proxy类过程源码分析和扩展点

前提

如果你已经很了解spring framework中bean生成的原理和过程,本文向你展示了一个精简版和可视化图谱;如果你很想了解bean生成的过程,本文提供你梯子快速的走入bean生成的原理和实现细节。减少你花费的时间

名词解析

  1. 入口:直接定位到一个功能实现的开始处,节省寻找定位花费的时间

知识点收获

通过本文,你能收获什么?

  1. .class文件生成beanDefinition的入口
  2. beanDefinition生成beanInstance的入口
  3. beanInstance生成proxy代理类的入口
  4. 如何直接debug指定bean的创建流程

》本文力求专注和精简,希望你有所收获和想法

我们都知道,spring framework震架之宝之一:IOC,将bean的创建和销毁交由spring容器,那么bean在创建的路上都要经过哪些路途呢,又是怎么放入spring容器的呢。我们顺着下面的轴线开始

.class-->beanDefinition-->beanInstance-->proxy类

首先看一张图,下图展示了.class文件生成beanDefinition 与 beanDefinition生成beanInstance 与 beanInstance生成proxy代理类的入口,有了此图,走源码时可以结合debug直接定位你要关注的细节。节省你和你寻找的知识点见面的时间

20191201103033.png

示例

为了我们定义一个简单的Service接口和实现类

1
2
3
4
5
@Service
public class UserServiceImpl implements IUserService {
@Override
public int insert(User user) {}
}

正文

开始看到spring容器中bean创建分成4个节点,三个阶段。如上轴线所示

bean在.class–>beanDefinition阶段

如果bean是我们项目中定义的@Component类,如示例UserServiceImpl类。它的加载和生成beanDefinition要感谢@ComponentScan这个注解,当然更要感谢真正发挥作用的ClassPathBeanDefinitionParser类它的doScan(basePackages)承担了这个阶段的功能实现。

bean在beanDefinition–>beanInstance阶段

这个阶段的功能实现一定要感谢AbstractAutowireCapableBeanFactory,记住这个常常的名字,因为每个bean的实例化都是他的功劳。它的createBean(beanName, RootBeanDefinition,args)方法如这个阶段的入口。入口内做了三件事

  1. 生成beanInstance,即bean对象本尊
    此功能由createBeanInstance(beanName, RootBeanDefinition,args)负责
  2. 向bean的beanDefinition赋属性和值
    此功能由populateBean(beanName, RootBeanDefinition,BeanWrapper)负责
  3. 如果满足条件,beanInstance生成Proxy代理类
    此功能由AbstractAutoProxyCreator.postProcessAfterInitialization(Object bean, beanName),原理是应用BeanPostProcessor的post-processor模式完成

bean在beanInstance–>proxy代理类

正如第二阶段第三件事做的事情

it`s time to summary

到这里,本文就说完了。篇幅很短,深度不深,细节不细。这正是本文的目的:剥离繁杂,直击目标。通过本文,你能清晰的知道: spring容器创建bean的道路上,有哪些关键节点,节点处发生了什么,何时发生的。到这你会问,怎么发生的你咋没说啊。是的,这里没说,原因是它会篇幅很长,对你整体把握spring容器创建bean不利。我想像剥洋葱一样一层一层深入,扎实清晰。

如果本文带给你兴趣了,那么深入剥洋葱这个事儿,你也可以开始了

最后附上spring容器管理bean的生命周期图
20191201231917.png

最后的最后,一个飞猫 relax us
飞猫.png